package sip_core

import "encoding/xml"

type SipBaseXML struct {
	XMLName xml.Name
	//命令类型(必选)
	CmdType string `xml:"CmdType"`
	//命令序列号(必选)
	SN int `xml:"SN"`
}

// SipMsg 设备消息xml结构
type SipMsgXML struct {
	*SipBaseXML
	//目标/源设备编码(必选)
	DeviceID string `xml:"DeviceID"`
}

// DeviceIDType设备编码类型
// 在取值为行政区划时可为2、4、6、8位,其他情况取值为20位
type DeviceIDType string

// StatusType 状态类型 ON/OFF
type StatusType string

// ResultType 结果类型 OK/ERROR
type ResultType string

// PTZType 控制码类型
type PTZType string

// recordType 录像控制类型 Record/StopRecord
type RecordType string

// GuardType 布防/撤防控制类型 SetGuard/ResetGuard
type GuardType string

// ItemType 设备目录项类型
type ItemType struct {
	XMLName xml.Name `xml:"Item"`
	//设备/区域/系统编码(必选)
	DeviceID string `xml:"DeviceID" gorm:"column:device_sip_id"`
	//设备/区域/系统名称(必选)
	Name string `xml:"Name" gorm:"column:device_name"`
	//当为设备时,设备厂商(必选)
	Manufacturer string `xml:"Manufacturer" gorm:"column:device_vendor"`
	//当为设备时,设备型号(必选)
	Model string `xml:"Model" gorm:"column:device_model"`
	//当为设备时,设备归属(必选)
	Owner string `xml:"Owner" gorm:"column:device_city"`
	//行政区域(必选)
	CivilCode string `xml:"CivilCode"`
	//警区(可选)
	Block string `xml:"Block"`
	//当为设备时,安装地址(必选)
	Address string `xml:"Address"`
	//当为设备时,是否有子设备(必选)1有,0没有
	Parental int `xml:"Parental"`
	//父设备/区域/系统ID(必选)
	ParentID string `xml:"ParentID" gorm:"column:device_city"`
	//信令安全模式(可选)缺省为0; 0:不采用;2:S/MIME 签名方式;3:S/MIME加密签名同时采用方式;4:数字摘要方式
	SafetyWay int `xml:"SafetyWay"`
	//注册方式(必选)缺省为1;1:符合IETFRFC3261标准的认证注册模式;2:基于口令的双向认证注册模式;3:基于数字证书的双向认证注册模式
	RegisterWay string `xml:"RegisterWay"`
	//证书序列号(有证书的设备必选)
	CertNum string `xml:"CertNum"`
	//证书有效标识(有证书的设备必选)缺省为0;证书有效标识:0:无效 1:有效
	Certifiable int `xml:"Certifiable"`
	//无效原因码(有证书且证书无效的设备必选)
	ErrCode string `xml:"ErrCode"`
	//证书终止有效期(有证书的设备必选)
	EndTime string `xml:"EndTime"`
	//保密属性(必选)缺省为0;0:不涉密,1:涉密
	Secrecy int `xml:"Secrecy"`
	//设备/区域/系统IP地址(可选)
	IPAddress string `xml:"IPAddress" gorm:"column:device_ip"`
	//设备/区域/系统端口(可选)
	Port string `xml:"Port" gorm:"column:device_port"`
	//设备口令(可选)
	Password string `xml:"Password" gorm:"column:user_password"`
	//设备状态(必选)
	Status StatusType `xml:"Status"`
	//经度(必选)
	Longitude string `xml:"Longitude"`
	//纬度(必选)
	Latitude string `xml:"Latitude"`
	Info     struct {
		//摄像机类型扩展,标识摄像机类型:1-球机;2-半球;3-固定枪机;4-遥控枪机。当目录项为摄像机时可选
		PTZType int `xml:"PTZType"`
		//-摄像机位置类型扩展。1-省际检查站、2-党政机关、3-车站码头、4-中心广场、5-体育场馆、6-商业中心、7-宗教场所、8-校园周边、9-治安复杂区域、10-交通干线。当目录项为摄像机时可选。
		PositionType int `xml:"PositionType"`
		//摄像机安装位置室外、室内属性。1-室外、2-室内。当目录项为摄像机时可选,缺省为1
		RoomType int `xml:"RoomType"`
		//摄像机用途属性。1-治安、2-交通、3-重点。当目录项为摄像机时可选
		UseType int `xml:"UseType"`
		//摄像机补光属性。1-无补光、2-红外补光、3-白光补光。当目录项为摄像机时可选,缺省为1
		SupplyLightType int `xml:"SupplyLightType"`
		//摄像机监视方位属性。1-东、2-西、3-南、4-北、5-东南、6-东北、7-西南、8-西北。当目录项为摄像机时且为固定摄像机或设置看守位摄像机时可选。
		DirectionType int `xml:"DirectionType"`
		//摄像机支持的分辨率,可有多个分辨率值,各个取值间以“/”分隔。分辨率取值参见附录 F中SDPf字段规定。当目录项为摄像机时可选
		Resolution string `xml:"Resolution"`
		//虚拟组织所属的业务分组ID,业务分组根据特定的业务需求制定,一个业务分组包含一组特定的虚拟组织
		BusinessGroupID string `xml:"BusinessGroupID"`
		//下载倍速范围(可选),各可选参数以“/”分隔,如设备支持1,2,4倍速下载则应写为“1/2/4
		DownloadSpeed string `xml:"DownloadSpeed"`
		//空域编码能力,取值0:不支持;1:1级增强(1个增强层);2:2级增强(2个增强层);3:3级增强(3个增强层)(可选)
		SVCSpaceSupportMode int `xml:"SVCSpaceSupportMode"`
		//时域编码能力,取值0:不支持;1:1级增强;2:2级增强;3:3级增强(可选)
		SVCTimeSupportMode int `xml:"SVCTimeSupportMode"`
	} `xml:"Info"`
}

// BasicParam 设备配置基本参数xml结构
type BasicParam struct {
	//设备名称(必选)
	Name          string `xml:"Name"`
	DeviceID      string `xml:"DeviceID"`
	SIPServerID   string `xml:"SIPServerID"`
	SIPServerIP   string `xml:"SIPServerIP"`
	SIPServerPort string `xml:"SIPServerPort"`
	DomainName    string `xml:"DomainName"`
	//注册过期时间(必选)
	Expiration string `xml:"Expiration"`
	Password   string `xml:"Password"`
	//心跳间隔时间(必选)
	HeartBeatInterval int `xml:"HeartBeatInterval"`
	//心跳超时次数(必选)
	HeartBeatCount int `xml:"HeartBeatCount"`
	//定位功能支持情况。取值:0-不支持;1-支持 GPS定位;2-支持北斗定位(可选,默认取值为0)
	PositionCapability int `xml:"PositionCapability"`
	//经度(可选)
	Longitude string `xml:"Longitude"`
	//纬度(可选)
	Latitude string `xml:"Latitude"`
}

// VideoParamOpt 设备配置视频参数xml结构
type VideoParamOpt struct {
	//下载倍速范围(可选),各可选参数以“/”分隔,如设备支持1,2,4倍速下载则应写为“1/2/4”
	DownloadSpeed int `xml:"DownloadSpeed"`
	//-摄像机支持的分辨率(可选),可有多个分辨率值,各个取值间以“/”分隔。分辨率取值参见附录 F中SDPf字段规定
	Resolution string `xml:"Resolution"`
}

// SVACEncodeConfig SVAC编码配置xml结构
type SVACEncodeConfig struct {
	//感兴趣区域参数(必选)
	ROIParam struct {
		//感兴趣区域开关,取值0:关闭,1:打开(必选)
		ROIFlag int `xml:"ROIFlag"`
		//感兴趣区域数量,取值范围0~16(必选)
		ROINumber int `xml:"ROINumber"`
		//感兴趣区域(可选)
		Items []struct {
			//感兴趣区域编号,取值范围1~16(必选)
			ROISeq int `xml:"ROISeq"`
			//感兴趣区域左上角坐标,参考 GB/T25724—2010的5.2.4.4.2定义,取值范围0~19683(必选)
			TopLeft int `xml:"TopLeft"`
			//感兴趣区域右下角坐标,参考 GB/T25724—2010的5.2.4.4.2定义,取值范围0~19683(必选)
			BottomRight int `xml:"BottomRight"`
			//ROI区域编码质量等级,取值0:一般,1:较好,2:好,3:很好(必选)
			ROIQP int `xml:"ROIQP"`
		} `xml:"Item"`
		//背景区域编码质量等级,取值0:一般,1:较好,2:好,3:很好(必选)
		BackGroundQP int `xml:"BackGroundQP"`
		//背景跳过开关,取值0:关闭,1:打开(必选)
		BackGroundSkipFlag int `xml:"BackGroundSkipFlag"`
	} `xml:"ROIParam"`
	//SVC参数(可选)
	SVCParam struct {
		//空域编码方式,取值0:基本层;1:1级增强(1个增强层);2:2级增强(2个增强层);3:3级增强(3个增强层)(必选)
		SVCSpaceDomainMode int `xml:"SVCSpaceDomainMode"`
		//时域编码方式,取值0:基本层;1:1级增强;2:2级增强;3:3级增强(必选)
		SVCTimeDomainMode int `xml:"SVCTimeDomainMode"`
		//空域编码能力,取值0:不支持;1:1级增强(1个增强层);2:2级增强(2个增强层);3:3级增强(3个增强层)(必选)
		SVCSpaceSupportMode int `xml:"SVCSpaceSupportMode"`
		//时域编码能力,取值0:不支持;1:1级增强;2:2级增强;3:3级增强(必选)
		SVCTimeSupportMode int `xml:"SVCTimeSupportMode"`
	} `xml:"SVCParam"`
	//监控专用信息参数(可选)
	SurveillanceParam struct {
		//绝对时间信息开关,取值0:关闭,1:打开(必选)
		TimeFlag int `xml:"TimeFlag"`
		//监控事件信息开关,取值0:关闭,1:打开(必选)
		EventFlag int `xml:"EventFlag"`
		//报警信息开关,取值0:关闭,1:打开(必选)
		AlertFlag int `xml:"AlertFlag"`
	} `xml:"SurveillanceParam"`
	//音频参数(可选)
	AudioParam struct {
		//声音识别特征参数开关,取值0:关闭,1:打开(必选)
		AudioRecognitionFlag int `xml:"AudioRecognitionFlag"`
	} `xml:"AudioParam"`
}

// SVACDecodeConfig SVAC解码配置xml结构
type SVACDecodeConfig struct {
	//SVC参数(可选)
	SVCParam struct {
		//空域编码能力,取值0:不支持;1:1级增强(1个增强层);2:2级增强(2个增强层);3:3级增强(3个增强层)(必选)
		SVCSpaceSupportMode int `xml:"SVCSpaceSupportMode"`
		//时域编码能力,取值0:不支持;1:1级增强;2:2级增强;3:3级增强(必选)
		SVCTimeSupportMode int `xml:"SVCTimeSupportMode"`
	} `xml:"SVCParam"`
	//监控专用信息参数(可选)
	SurveillanceParam struct {
		//绝对时间信息显示开关,取值0:关闭,1:打开(必选)
		TimeShowFlag int `xml:"TimeShowFlag"`
		//监控事件信息显示开关,取值0:关闭,1:打开(必选)
		EventShowFlag int `xml:"EventShowFlag"`
		//报警信息显示开关,取值0:关闭,1:打开(必选)
		AlerShowtFlag int `xml:"AlerShowtFlag"`
	} `xml:"SurveillanceParam"`
}
